interface DesignNode {
  //节点数据
  id: string; //节点id,当前流程内唯一，由前端随机生成
  parentId?: string; //父节点id
  type: string; //节点类型,ROOT(发起人，根节点)、APPROVAL(审批)、CC(抄送)、CONDITIONS(条件组)、CONCURRENTS（并行节点组）、CONDITION(条件子分支)、CONCURRENT（并行子分支）、DELAY(延时节点)、TRIGGER(触发器)、EMPTY(空节点，占位)
  name: string; //节点名称,显示在设计器中卡片头部名称
  props?: {}; //节点属性设置	节点的设置项内容
  children?:  Array<Array<DesignNode>>; //子节点项	节点下方的子节点，无限嵌套，内部字段与当前结构相同
  branchs?: [any]; //子分支项	当type 为 CONDITIONS / CONCURRENTS 时，该项存在，内容为条件或并行节点内的所有分支
}

// //发起人权限，哪些 人/部门 可以发起这个审批
interface RootNode {
  //根节点props
  sssignedUser: [
    {
      id: string;
      name: string;
      type: string; //user | dept //判断是个人还是部门
    }
  ];
  formPerms?: [string];
}

interface AppRovalNode {
  //审批节点props
  assignedType?: string; // //审批处理的类型 ASSIGN_USER 指定人员、SELF_SELECT 发起人自选、LEADER_TOP 连续多级主管、LEADER 主管、ROLE 指定角色、SELF 发起人自己、REFUSE 自动拒绝、FORM_USER指定表单联系人
  mode?: string; //多人审批时的审批模式，AND会签、or或签、Next顺序以此审批
  sign?: boolean; //审批同意时是否签字
  formPerms?: [string]; //表单权限设置
  noBody?: {
    handler: string; //PASS 直接通过、 TO_ADMIN 转交主管理员、TO_USER 转交指定人员
    assignedUser?: string; //TO_USER 时的指定人员
  };
  timeLimit?: {
    //超时时间限制
    timeout: {
      unit: string; //时间单位 M分钟、H小时、D天,
      value: number; //时间值
    };
    //超时后的处理规则
    handler: {
      type: string; //PASS 自动通过、REFUSE 自动驳回、NOTIFY 发送通知进行提醒
      notify: {
        once: boolean; //是否只提醒一次
        hour: number; //重复提醒，几小时提醒一次
      };
    };
  };
  assignedUser?: [string]; //指定审批人员 ASSIGN_USER 时不为空
  //发起人自选
  selfSelect?: {
    multiple: boolean; // 是否多选 true/false
  };
  //连续多级主管
  leaderTop?: {
    endCondition: string; //结束条件 TOP 直到最上级主管、 LEVEL 指定不超过多少级主管
    endLevel: number; //指定级别主管审批后结束本节点
  };
  //指定主管审批
  leader?: {
    level: number; //发起人指定级别主管
  };
  //指定角色审批
  role?: [{ id: string; name: string }, { id: string; name: string }]; //指定审批人为系统角色
  refuse?: {
    //驳回设置
    //TO_END 驳回直接结束流程、TO_NODE 驳回到指定节点、TO_BEFORE 驳回到上一级
    type: string;
    target: string; //驳回到指定ID的节点
  };
  formUser?: string; //类型为指定表单联系人时，对应表单组件ID
}

interface ConditionNode {
  // 条件节点
  groupsType: string; //条件组逻辑关系 OR、AND
  groups: [
    {
      groupType: string; //条件组内条件关系 OR、AND
      //组内子条件
      conditions: [
        {
          cid: string; //组件ID，通过组件ID索引到表单设计器中的组件
          compare: string; //比较运算符 >大于 <小于 大于等于 小于等于 范围
          value: [string]; //比较值，如果只需要比较一个值，那么只取value[0]
        }
      ];
    }
  ];
  expression: string; //自定义表达式，灵活构建逻辑关系
}
interface CcNode {
  //抄送节点
  shouldAdd: boolean; //允许发起人自选抄送人
  assignedUser: [string]; //指定抄送人员
}

interface DelayNode {
  //延时处理节点
  type: string; //延时类型 FIXED:到达当前节点后延时固定时长 、AUTO:延时到 dateTime设置的时间
  time: number; //延时时间
  unit: string; //时间单位 D天 H小时 M分钟
  dateTime: string; //如果当天没有超过设置的此时间点，就延时到这个指定的时间，到了就直接跳过不延时
}

interface TriggerNode {
  //触发器节点
  type: string; //触发的动作类型 WEBHOOK、EMAIL
  http: {
    method: string; //请求方法 支持GET/POST
    url: string; //URL地址，可以直接带参数
    headers: [
      //http header
      {
        name: string;
        isField: boolean;
        value: string; //支持表达式 ${xxx} xxx为表单字段名称
      }
    ];
    contentType: string; //请求参数类型
    params: [
      //请求参数
      {
        name: string;
        isField: boolean; //是表单字段还是自定义
        value: string; //支持表达式 ${xxx} xxx为表单字段名称
      }
    ];
    retry: 1; //重试次数
    handlerByScript: false; //是否使用脚本处理请求结果
    success: string; //'function resHandler(res) {\n  return true;\n}',
    fail: string; //'function resHandler(res) {\n  return true;\n}'
  };
  email: {
    subject: string;
    to: [string];
    content: string;
  };
}

interface FormPerms {
  id: string; //表单字段ID
  perm: string; //权限标识
  title: string; ///表单名称
}
export type {
  DesignNode,
  RootNode,
  AppRovalNode,
  ConditionNode,
  CcNode,
  DelayNode,
  TriggerNode,
  FormPerms,
};
